package cz.vse.adventura.po1715.xkosd00_kostka.hra;

import static cz.vse.adventura.po1715.xkosd00_kostka.hra.Texty.*;


/*******************************************************************************
 * Instance tridy {@code PrikazVezmi} predstavuje prikaz
 * k odebrani predmetu z aktualni mistnosti a jeho umisteni do batohu.
 * Aby byl prikaz proveden, musi byt zadan nazev predmetu,
 * ktery se v aktualni mistnosti vyskytuje, predmet musi byt
 * zvednutelny a v batohu musi byt jeste volne misto.
 * @author    Dominik KOSTKA
 * @version   1.0
 */
public class PrikazVezmi extends APrikaz
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public PrikazVezmi()
    {
        super(pVEZMI, //"Vezmi",
           "Příkaz odebere předmět zadaného názvu z aktuální místnosti\n" +
           "a umístí jej do batohu.\n" +
           "Aby byl příkaz proveden, musí byt\n" +
           "- zadán název předmětu, který se v místnosti vyskytuje,\n" +
           "- předmět musí byt zvednutelný a\n" +
           "- v batohu musí byt ještě volné místo.");
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Vezme z místnosti předmět zadaného názvu a umístí je do batohu;
     * nejprve však zkontroluje, zda byl vůbec zadán název předmětu,
     * který se má zvednout, zda je tento předmět zvednutelný a zda se další
     * předmět ještě vejde do batohu.
     *
     * @param  parametry Nazev zvedaneho predmetu
     * @return Text zpravy vypsane po porovedeni prikazu
     */
    @Override
    public String execute( String... parametry )
    {
        if (parametry.length == 0) return zPŘEDMĚT_NEZADAN;


        String   nazev   = parametry[0];
        Mistnost am      = Mistnost.getAktuálníMístnost();
        Predmet  predmet = am.zvedni( nazev );

        if (predmet == null ) return zNENÍ_PŘEDMĚT + nazev;

        if (predmet == Predmet.TÍHA) return zTĚŽKÝ_PŘEDMĚT + nazev;
        
        Batoh batoh = Batoh.getBatoh();

        if (!batoh.pridej(predmet)) {
            am.poloz( predmet );
            return zBATOH_PLNÝ;
        }                                                      

        return zZVEDNUTO + predmet.getName();
    }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        PrikazVezmi inst = new PrikazVezmi();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
